﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace WFExtended.Twitter
{
    /// <summary>
    /// Tweet User
    /// </summary>
    [DataContract]
    public class User
    {
        /// <summary>
        /// Gets or sets the ID.
        /// </summary>
        /// <value>
        /// The ID.
        /// </value>
        [DataMember(Name = "id")]
        public long ID { get; set; }

        /// <summary>
        /// Gets or sets the ID string.
        /// </summary>
        /// <value>
        /// The ID string.
        /// </value>
        [DataMember(Name = "id_str")]
        public string IDString { get; set; }

        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        /// <value>
        /// The name.
        /// </value>
        [DataMember(Name = "name")]
        public string Name { get; set; }

        /// <summary>
        /// Gets or sets the name of the screen.
        /// </summary>
        /// <value>
        /// The name of the screen.
        /// </value>
        [DataMember(Name = "screen_name")]
        public string ScreenName { get; set; }

        /// <summary>
        /// Gets or sets the location.
        /// </summary>
        /// <value>
        /// The location.
        /// </value>
        [DataMember(Name = "location")]
        public string Location { get; set; }

        /// <summary>
        /// Gets or sets the description.
        /// </summary>
        /// <value>
        /// The description.
        /// </value>
        [DataMember(Name = "description")]
        public string Description { get; set; }

        /// <summary>
        /// Gets or sets the URL.
        /// </summary>
        /// <value>
        /// The URL.
        /// </value>
        [DataMember(Name = "url")]
        public string Url { get; set; }

        /// <summary>
        /// Gets or sets the entities.
        /// </summary>
        /// <value>
        /// The entities.
        /// </value>
        [DataMember(Name = "entities")]
        public Entities Entities { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="User"/> is protected.
        /// </summary>
        /// <value>
        ///   <c>true</c> if protected; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "protected")]
        public bool Protected { get; set; }

        /// <summary>
        /// Gets or sets the followers count.
        /// </summary>
        /// <value>
        /// The followers count.
        /// </value>
        [DataMember(Name = "followers_count")]
        public int? FollowersCount { get; set; }

        /// <summary>
        /// Gets or sets the friends count.
        /// </summary>
        /// <value>
        /// The friends count.
        /// </value>
        [DataMember(Name = "friends_count")]
        public int? FriendsCount { get; set; }

        /// <summary>
        /// Gets or sets the listed count.
        /// </summary>
        /// <value>
        /// The listed count.
        /// </value>
        [DataMember(Name = "listed_count")]
        public int? ListedCount { get; set; }

        /// <summary>
        /// Gets or sets the created at.
        /// </summary>
        /// <value>
        /// The created at.
        /// </value>
        [DataMember(Name = "created_at")]
        public string CreatedAt { get; set; }

        /// <summary>
        /// Gets or sets the favourites count.
        /// </summary>
        /// <value>
        /// The favourites count.
        /// </value>
        [DataMember(Name = "favourites_count")]
        public int? FavouritesCount { get; set; }

        /// <summary>
        /// Gets or sets the UTC offset.
        /// </summary>
        /// <value>
        /// The UTC offset.
        /// </value>
        [DataMember(Name = "utc_offset")]
        public int? UtcOffset { get; set; }

        /// <summary>
        /// Gets or sets the time zone.
        /// </summary>
        /// <value>
        /// The time zone.
        /// </value>
        [DataMember(Name = "time_zone")]
        public string TimeZone { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether [geo enabled].
        /// </summary>
        /// <value>
        ///   <c>true</c> if [geo enabled]; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "geo_enabled")]
        public bool GeoEnabled { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="User"/> is verified.
        /// </summary>
        /// <value>
        ///   <c>true</c> if verified; otherwise, <c>false</c>.
        /// </value>
        [DataMember(Name = "verified")]
        public bool Verified { get; set; }

        /// <summary>
        /// Gets or sets the statuses count.
        /// </summary>
        /// <value>
        /// The statuses count.
        /// </value>
        [DataMember(Name = "statuses_count")]
        public int? StatusesCount { get; set; }

        /// <summary>
        /// Gets or sets the lang.
        /// </summary>
        /// <value>
        /// The lang.
        /// </value>
        [DataMember(Name = "lang")]
        public string Lang { get; set; }

        /// <summary>
        /// Gets or sets the contributors enabled.
        /// </summary>
        /// <value>
        /// The contributors enabled.
        /// </value>
        [DataMember(Name = "contributors_enabled")]
        public bool? ContributorsEnabled { get; set; }

        /// <summary>
        /// Gets or sets the is translator.
        /// </summary>
        /// <value>
        /// The is translator.
        /// </value>
        [DataMember(Name = "is_translator")]
        public bool? IsTranslator { get; set; }

        /// <summary>
        /// Gets or sets the color of the profile background.
        /// </summary>
        /// <value>
        /// The color of the profile background.
        /// </value>
        [DataMember(Name = "profile_background_color")]
        public string ProfileBackgroundColor { get; set; }

        /// <summary>
        /// Gets or sets the profile background image URL.
        /// </summary>
        /// <value>
        /// The profile background image URL.
        /// </value>
        [DataMember(Name = "profile_background_image_url")]
        public string ProfileBackgroundImageUrl { get; set; }

        /// <summary>
        /// Gets or sets the profile background image URL HTTPS.
        /// </summary>
        /// <value>
        /// The profile background image URL HTTPS.
        /// </value>
        [DataMember(Name = "profile_background_image_url_https")]
        public string ProfileBackgroundImageUrlHttps { get; set; }

        /// <summary>
        /// Gets or sets the profile background tile.
        /// </summary>
        /// <value>
        /// The profile background tile.
        /// </value>
        [DataMember(Name = "profile_background_tile")]
        public bool? ProfileBackgroundTile { get; set; }

        /// <summary>
        /// Gets or sets the profile image URL.
        /// </summary>
        /// <value>
        /// The profile image URL.
        /// </value>
        [DataMember(Name = "profile_image_url")]
        public string ProfileImageUrl { get; set; }

        /// <summary>
        /// Gets or sets the profile image URL HTTPS.
        /// </summary>
        /// <value>
        /// The profile image URL HTTPS.
        /// </value>
        [DataMember(Name = "profile_image_url_https")]
        public string ProfileImageUrlHttps { get; set; }

        /// <summary>
        /// Gets or sets the color of the profile link.
        /// </summary>
        /// <value>
        /// The color of the profile link.
        /// </value>
        [DataMember(Name = "profile_link_color")]
        public string ProfileLinkColor { get; set; }

        /// <summary>
        /// Gets or sets the color of the profile sidebar border.
        /// </summary>
        /// <value>
        /// The color of the profile sidebar border.
        /// </value>
        [DataMember(Name = "profile_sidebar_border_color")]
        public string ProfileSidebarBorderColor { get; set; }

        /// <summary>
        /// Gets or sets the color of the profile sidebar fill.
        /// </summary>
        /// <value>
        /// The color of the profile sidebar fill.
        /// </value>
        [DataMember(Name = "profile_sidebar_fill_color")]
        public string ProfileSidebarFillColor { get; set; }

        /// <summary>
        /// Gets or sets the color of the profile text.
        /// </summary>
        /// <value>
        /// The color of the profile text.
        /// </value>
        [DataMember(Name = "profile_text_color")]
        public string ProfileTextColor { get; set; }

        /// <summary>
        /// Gets or sets the profile use background image.
        /// </summary>
        /// <value>
        /// The profile use background image.
        /// </value>
        [DataMember(Name = "profile_use_background_image")]
        public bool? ProfileUseBackgroundImage { get; set; }

        /// <summary>
        /// Gets or sets the default profile.
        /// </summary>
        /// <value>
        /// The default profile.
        /// </value>
        [DataMember(Name = "default_profile")]
        public bool? DefaultProfile { get; set; }

        /// <summary>
        /// Gets or sets the default profile image.
        /// </summary>
        /// <value>
        /// The default profile image.
        /// </value>
        [DataMember(Name = "default_profile_image")]
        public bool? DefaultProfileImage { get; set; }

        /// <summary>
        /// Gets or sets the follow request sent.
        /// </summary>
        /// <value>
        /// The follow request sent.
        /// </value>
        [DataMember(Name = "follow_request_sent")]
        public bool? FollowRequestSent { get; set; }
    }
}
